__author__ = 'zhiweifan'
# Fibonacci series:
# the sum of two elements defines the next
a,b = 0, 1 # 多重赋值
while b < 10:
    # print(b)
    print(b, end=',') # 禁止换行
    a, b = b, a + b

##############################
# # if语句
# x = int(input("Please enter an integer: "))
# if x < 0:
#     x = 0
#     print('Negative changed to zero')
# elif x == 0:
#     print('Zero')
# elif x == 1:
#     print('Single')
# else:
#     print('More')

############################
# for语句
# Measure some strings:
a = ['cat', 'window', 'defenestrate']
for x in a:
    print(x, len(x))

# 如果你需要一个数值序列，内置函数 range() 会很方便
for i in range(5):
    print(i)
# range(10)生成了一个包含10个值的链表，它用链表的索引值填充了这个长度为 10的列表，所生成的链表中不包括范围中的结束值。
# 也可以让range操作从另一个数值开始，或者可以指定一个不同的步进值（甚至是负数，有时这也被称为 “步长”）
#
# range(5, 10)
# 5 through 9
#
# range(0, 10, 3)
# 0, 3, 6, 9
#
# range(-10, -100, -30)
# -10, -40, -70

# 需要迭代链表索引的话，如下所示结合使 用 range() 和 len()
a = ['Mary', 'had', 'a', 'little', 'lamb']
for i in range(len(a)):
    print(i, a[i])

# 作为那些期望从某些东西中获得连续项直到结束的函数或结构的一个目标（参数）, for 语句就是这样一个 迭代器
# list() 函数是另外一个（ 迭代器），它从可迭代（对象）中创建列表:
a = list(range(5))
print(a)

#########################
# break 和 continue 语句, 以及循环中的 else 子句
# continue 语句是从 C 中借鉴来的，它表示循环继续执行下一次迭代
# 循环可以有一个 else 子句;它在循环迭代完整个列表（对于 for ）或执行条件为 false （对于 while ）时执行，但循环被 break 中止的情况下不会执行
for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print(n, 'equals', x, '*', n//x)
            break # 下面的else 与for同级，break执行时，else不执行；
    else: # 一次循环结束，break未执行，则执行else
        # loop fell through without finding a factor
        print(n, 'is a prime number')

###########################
# pass 语句什么也不做。它用于那些语法上必须要有什么语句，但程序什么也不做的场合
# while True:
#     pass

# 循环技巧
# 在字典中循环时，关键字和对应的值可以使用 iteritems() 方法同时解读出来。
knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in knights.items():
    print(k, v)
# 在序列中循环时，索引位置和对应值可以使用 enumerate() 函数同时得到。:
for i, v in enumerate(['tic', 'tac', 'toe']):
    print(i, v)
# 0 tic
# 1 tac
# 2 toe

# 同时循环两个或更多的序列，可以使用 zip() 整体打包。:
questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q, a in zip(questions, answers):
    print('What is your {0}?  It is {1}.'.format(q, a))

for i in reversed(range(1, 10, 2)):
    print(i)
# 要按排序后的顺序循环序列的话，使用 sorted() 函数，它不改动原序列，而是生成一个新的已排序的序列。
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for f in sorted(set(basket)):
    print(f)

# 5.7. 深入条件控制
# while 和 if 语句中使用的条件不仅可以使用比较，而且可以包含任意的操作。
# 比较操作符 in 和 not in 审核值是否在一个区间之内。操作符 is 和 is not 比较两个对象是否相同；这只和诸如链表这样的可变对象有关。所有的比较操作符具有相同的优先级，低于所有的数值操作。
# 比较操作可以传递。例如 a < b == c 审核是否 a 小于 b 并且 b 等于 c 。
# 比较操作可以通过逻辑操作符 and 和 or 组合，比较的结果可以用 not 来取反义。这些操作符的优先级又低于比较操作符，在它们之中，not 具有最高的优先级， or 优先级最低，
# 所以 A and not B or C 等于 (A and (notB)) or C 。当然，括号也可以用于比较表达式。
# 逻辑操作符 and 和 or 也称作 短路操作符 ：它们的参数从左向右解析，一旦结果可以确定就停止。例如，如果 A 和 C 为真而 B 为假， A and B and C 不会解析 C 。作用于一个普通的非逻辑值时，短路操作符的返回值通常是最后一个变量。
# 可以把比较或其它逻辑表达式的返回值赋给一个变量，例如，
# >>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
# >>> non_null = string1 or string2 or string3
# >>> non_null
# 'Trondheim'
# 需要注意的是 Python 与 C 不同，在表达式内部不能赋值。C 程序员经常对此抱怨，不过它避免了一类在 C 程序中司空见惯的错误：想要在解析式中使 == 时误用了 = 操作符。
#
# 5.8. 比较序列和其它类型
# 序列对象可以与相同类型的其它对象比较。比较操作按 字典序 进行：首先比较前两个元素，如果不同，就决定了比较的结果；如果相同，就比较后两个元素，依此类推，直到所有序列都完成比较。如果两个元素本身就是同样类 型的序列，就递归字典序比较。如果两个序列的所有子项都相等，就认为序列相等。
# 如果一个序列是另一个序列的初始子序列，较短的一个序列就小于另一个。字符 串的字典序按照单字符的 ASCII 顺序。下面是同类型序列之间比较的一些例子:
#
# (1, 2, 3)              < (1, 2, 4)
# [1, 2, 3]              < [1, 2, 4]
# 'ABC' < 'C' < 'Pascal' < 'Python'
# (1, 2, 3, 4)           < (1, 2, 4)
# (1, 2)                 < (1, 2, -1)
# (1, 2, 3)             == (1.0, 2.0, 3.0)
# (1, 2, ('aa', 'ab'))   < (1, 2, ('abc', 'a'), 4)
# 需要注意的是如果通过 < 或者 > 比较的对象只要具有合适的比较方法就是合法的。 比如，混合数值类型是通过它们的数值就行比较的，所以 0 是等于 0.0 。 否则解释器将会触发一个 TypeError 异常，而不是提供一个随意的结果。

print((4, 2, 3) < (2, 2, 4))
print((1, 2, ('aa', 'ab'))   < (1, 2, ('abc', 'a'), 4))